/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.vse.adventura.po1715.xskrz00_skrivankova.gui;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.Commands;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_txt.INamed;
import cz.pecinovsky.english.pojj.adv_framework.gui_stage.IGUI_03;
import cz.pecinovsky.english.pojj.adv_framework.gui_stage.IGUI_03_Pane;
import cz.pecinovsky.english.pojj.adv_framework.game_gui.IObjectG;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JLabel;


/*******************************************************************************
 * Instance třídy {@code AContainerPane} představují ...
 *
 * @author    Rudolf PECINOVSKÝ
 * @version   0.00.000
 */
@SuppressWarnings("serial")
abstract class AContainerPane<Element extends INamed>
       extends Box
       implements IGUI_03_Pane
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Posluchač události stisku tlačítka v panelu. */
    private final ActionListener listener = new ButtonListener();

    /** Odstup mezi jednotlivými prvky panelu. */
    private final Dimension distance;

    /** GUI, které daný panel používá. */
    protected final IGUI_03 gui;

    /** Návěští v panelu sousedů specifikující obsah daného panelu. */
    private final JLabel title;

    /** Typ příkazu realizujcícího změny v daném panelu. */
    private final Commands.Type typeOfCommand;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================

    /** Aktuálně provozovaná hra. */
    private IGameG game;

    /** Název příkazu realizujcícího změny v daném panelu. */
    private String command;



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Obecný panel skládající komponenty za sebou v řadě
     * vodorovně nebo svisle.
     *
     * @param gui           GUI, které bude daný panel používat
     * @param title         Titulek uvozující obsash daného panelu
     * @param direction     Směr, v němž bude daný panel skládet komponenty
     * @param distance      Odstup mezi jednotlivými prvky panelu
     * @param typeOfCommand Příkaz realizujcící změny v daném panelu
     */
    AContainerPane(IGUI_03 gui,   String title,
                   int direction, Dimension distance,
                   Commands.Type  typeOfCommand)
    {
        super(direction);
        this.gui            = gui;
        this.title          = new JLabel(title);
        this.distance       = distance;
        this.typeOfCommand  = typeOfCommand;
    }



//== ABSTRAKTNÍ METODY =========================================================

    /***************************************************************************
     * Vrátí kolekci s prvky, které se mají zobrazit v panelu.
     *
     * @return Kolekce s prvky, které se mají zobrazit v panelu
     */
//    @Override
    abstract Collection<? extends Element> getCollection();



//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí GUI, kterým je daný panel používán
     *
     * @return GUI, kterým je daný panel používán
     */
    public IGUI_03 getGui()
    {
        return gui;
    }


    /***************************************************************************
     * Vrátí nastavenou hru.
     *
     * @return Nastavenáý hra
     */
    public IGameG getGame()
    {
        return game;
    }



//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Inicializuje oblast zobrazující sousedy aktuálního prostoru.
     */
    @Override
    public void initialize()
    {
        removeAll();
        add(title);
        game = gui.getGame();
        command = game.getBasicCommands().getCommandName(typeOfCommand);
    }


    /***************************************************************************
     * Aktualizuje oblast zobrazující sousedy aktuálního prostoru.
     */
    @Override
    public void update()
    {
        initialize();
        Collection<? extends Element> elements = getCollection();

        for (Element element : elements) {
           add(Box.createRigidArea(distance));
//            String name = element.getName();
//            JButton button = new JButton(name);
            PaneItem button;
                if(element instanceof IObjectG) {
                    IObjectG object = (IObjectG) element;
                    button = new PaneItem(object);
                } else {
                    button = new PaneItem(element);
                }
            button.addActionListener(listener);
            add(button);
        }
    }



//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================

    /***************************************************************************
     * Posluchač reagující na stisk tlačítka tím,
     * že vyvolá příkaz s názvem tlačítka jako jeho parametrem.
     */
    private class ButtonListener implements ActionListener
    {
        /***********************************************************************
         * Zadá příkaz, jehož parametrem bude nápis na tlačítku.
         *
         * @param event Ohlášená událost, od níž zjistíme nápis na tlačítku
         */
        @Override
        public void actionPerformed(ActionEvent event)
        {
           //String argument = event.getActionCommand();
            PaneItem button = (PaneItem) event.getSource();
            String argument = button.getName();
            gui.executeCommand(command + " " + argument);
        }

    }
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        AContainerPane inst = new AContainerPane();
//    }
//    /** @param args Parametry příkazového řádku - nepoužívané. */
//    public static void main( String[] args )  {  test();  }
}
